SeminarioLP-Linguagem LUA - 1/2014 (Diego Santos, André Accioly)
Grupo * Diego Santos da Silva (11/0027892) * André Accioly Lima (12/0059908) Instrodução e Histórico Lua é uma linguagem de programação estruturada desenvolvida pelo grupo Tecgraf (Grupo de Tecnologia em Computação Gráfica) da PUC-Rio. Usada a princípio para ser usada em um projeto da Petrobras, mas pela facilidade de aprendizado da linguagem, clara e eficiente, passou a ser utilizada em outros campos da computação, como em desenvolvimento de jogos, controle de robôs, processamento de texto, inteligência artificial, etc. Essa linguagem foi criada em 1993 por Roberto Ierusalimschy, Luiz Henrique de Figueredo e Waldemar Celes, membros do Tecgraf, citado anteriormente. Possui semelhanças com as linguagens Icon e Python, e é de fácil utilização para pessoas que não são programadoras. Os criadores afirmam também que Lisp e Scheme foram uma grande influência para a criação de Lua, na decisão de desenvolver a tabela como principal estrutura de dados para Lua. O primeiro projeto que utilizou o Lua foi para o desenvolvimento do jogo Grim Fandango, em 1997, pela LucasArts, onde foi utilizada como linguagem de script. Mas, atualmente, a maior aplicação de Lua vem sendo na indústria de jogos: a linguagem é a mais utilizada em scripts nos dias de hoje, seguida de Python. Características É uma linguagem portável, simples, leve, de fácil integração e tem um bom desempenho, por isso vem cada vez mais ganhando espaço no mercado.Dá suporte para programação procedural, oferecendo facilidade para descrição dos dados . É uma linguagem muito utilizada para scripts e é uma linguagem extensível. Aderir uma linguagem de extensão a um projeto desenvolvimento de software é uma técnica poderosa, pois permite o controle de muitos aspectos da aplicação externamente, feito a partir de arquivos textos que podem ser editados pelo programador facilmente, tornando o desenvolvimento mais ágil, pois permite que parte do desenvolvimento seja feita por profissionais que não são exímios programadores (por exemplo, artistas e animadores na indústria de jogos). Apesar de todos seus pontos positivos, a linguagem ainda é limitada em certos aspectos. Por exemplo, é uma linguagem que não suporta orientação a objetos. Paradigmas de Projeto Premissas: Foi desenvolvida para uma linguagem extensível, ou seja, uma linguagem que é aderida a um projeto de software, permitindo o controle de muitos aspectos da aplicação externamente. “Fornecer apenas o necessário e maneiras simples de estender a linguagem para permitir que ela se encaixe em uma variedade de aplicações.” Usuário característico: Em seu princípio, Lua foi desenvolvida para ser utilizada em projetos de grandes empresas, mas devido a sua facilidade de uso e aprendizado, Lua pode ser utilizada por qualquer um, desde aos menos aos mais experientes programadores. Utilizada para aplicações em jogos, scripts e áreas da robótica e inteligência artificial. Também é utilizada para extensão de aplicações. ou seja, ela pode ser acoplada a programas maiores que precisam ler e executar programas escritos pelo usuário. Construtores e Declarações Em Lua, as''' variáveis''' não possuem tipos associados, ou seja, os tipos estão associados ao valor interno da variável. Ou seja, uma mesma variável pode receber um tipo de dado, e em outro momento, receber outro tipo de dado. a = "oi" b = 3 ... a = 2 b = 1.3 O fato de o tipo estar associado ao valor e não a variável dá grande flexibilidade à linguagem. Mas, por outro lado, a verificação de tipo só pode ser feita em tempo de execução. Ou seja, se duas variáveis de valores não numéricos forem somadas, um erro será reportado somente em tempo de execução. Em Lua, as variáveis globais não precisam ser declaradas, elas já são globais por padrão. Caso uma variável precise ser declarada com escopo local, ela deve ser declarada como local. local var As variáveis de lua podem ser dos seguintes tipos: * nil: indica ausência de valor; * boolena: valor booleano; * number: vallor numérico; * string: cadeia de caracteres; * table: vetor associativo; * function: função; * userdata: dado do host; * thread: co-rotinas. Os operadores em Lua são os mesmos operadores comumente utilizados em outras linguagens de programação: + (adição), - (subtração), * (multiplicação), / (divisão), ^ (exponenciação), - (unário), < (menor que), > (maior que), <= (menor ou igual que), >= (maior ou igual que), (igualdade), ~= (diferença). Os operadores lógicos para combinar operadores booleanos são dados por 'and', 'or' e 'not'. Esses operadores são utilizados para avaliação de expressões, que combinam duas expressões, onde a segunda é avaliada somente quando necessário. Existe também o operador '..' para concatenação de strings. Os controladores de fluxo na linguagem são semelhantes aos outros controladores de fluxo em outras linguagens: if expr then ... elseif expr2 then ... else ... end while expr do ... end repeat ... until expr for var = expr_inicial, expr_final, expr_incremento do ... end No caso do controlador 'for', a variável var é declarada local ao laço, ou seja, só existe dentro do laço. Se a expressão de incremento for omitida, ela vale 1. Outra construção do laço for: for expr in expr2 do ... end A execução dos laços pode ser interrompida com o comando break. Funções em Lua são valores de primeira classe, ou seja, podem ser criadas e armazenadas em variáveis ou campo de tabela, como também passada como parâmetro ou valor de retorno de outra função. As funções em Lua são anônimas, ou seja, funções são atribuições para uma variável, da mesma forma que qualquer outro valor. Então, a seguinte função: function fat(n) if n 0 then return 1 else return n*fat(n-1) end end É apenas umas forma conveniente de escrever uma função e atribuí-la a uma variável global, e é equivalente a: fat = function(n) ... end Lua permite atribuições múltiplas. É válido escrever x, y = y, x , que troca os valores de x e y sem a nec essidade de criar uma variável intermediária, como também é válido escrever x, y = 1, 2. Em Lua, as funções podem retornar múltiplos valores. Assim: return expr1, expr2, ... , exprN retorna múltiplos valores e n1, n2, ... , nN = f() atribui as variáveis os múltiplos retornos da função f. Se o número de variáveis a receber o retorno f or maior que o número de retorno, as variáveis excedentes recebem o valor nil. Em Lua, existe uma estrutura que permite que Lua opere como uma linguagem funcional, chamada de closure. ''Essa closure guarda uma referência para uma função anônima e uma lista com os valores das variáveis do escopo superior utilizadas, entre outras coisas. O tipo '''table '''em Lua representa um vetor associativo, implementado com uma combinação entre vetor e tabela de dispersão e é a única forma de estruturar dados em Lua. Todas as estruturas de dados que são encontradas normalmente nas linguagens de programação (lista, vetor, fila, hash) são implementadas através dos ''tables em Lua. Se uma variável armazena um valor do tipo tabela, essa variável pode ser indexada com qualquer outro valor (exceto nil), e o valor armazenado em cada índice da tabela pode ser de qualquer tipo. Uma tabela é criada através da expressão { }. newTable = {} (cria a table) newTable1 = 4 (armazena o valor 4 no índice 1) newTable2 = "oi" (armazena o valor "oi" no índice 2) newTable"oi" = 5 (armazena o valor 5 no índice "oi") newTable[newTable2] = 0 (sobrescreve o índice 2 com o valor 0) Exemplos de programas: Uma função para o cálculo de fatorial: function fact(n) if n 0 then return 1 else return n * fact(n - 1) end end Uma função que retorna outra função: function counter () local i = 0 return function () i = i+1 return i end end Lua atualmente é muito utilizada na indústria de jogos, e vem substituindo outras linguagens que funcionam para scripts. Mas ainda tem outras aplicações, como áreas de robótica, inteligência artificial e processamento de texto. Avaliação da Linguagem Legibilidade: Lua é uma linguagem com uma legibilidade alta, devido a suas estruturas simples e com proximidade a linguagem comum. Por isso, é uma linguagem de fácil aprendizado e está sendo cada vez mais utilizada. É possível verificar a sua legibilidade a partir das seguintes estruturas: for expr in expr2 do ... end Além de tudo, Lua é uma linguagem que reconhece indentação, o que obriga o programador a deixar seu código organizado. A utilização da palavra reservada end para demarcar final de blocos também é uma estrutura que melhora a legibilidade. Capacidade de escrita: Lua é uma linguagem com uma boa capacidade de escrita, e, diferentemente de muitas outras linguagens, não afeta muito em sua legibilidade. A linguagem fornece diversas formas de melhorar a escrita ou escrever estr uturas complexas em poucas linhas de código. Segue abaixo algumas dessas estruturas que dão a Lua uma boa capacidade de escrita: Uso de tables como única estrutura de dados, que pode representar tanto listas, filas, vetores e hash: idTable = {} dTable0 = "Alberto" idTable1 = "Joao" ... vector0 = 10 vector1 = 15 ... Outra estrutura que dá a Lua uma alta capacidade de escrita é a possibilidade de se fazer atribuições m últiplas: varX, varY, varZ = 4, 3, "abc" Como também funções terem retornos múltiplos: return expr1, expr2, ... , exprN varX, varY, ... , varN = func() Custo: No geral, a linguagem Lua possui um baixo custo, por ser uma linguagem open source, de fácil apre ndizagem e que exige pouco do hardware, ou seja, a linguagem pode ser utilizada em máquinas pouco potentes. Confiabilidade: A linguagem possui checagem de tipos dinâmica e coletor de lixo, o que implica em uma diminuição de sua confiabilidade. Com coletor de lixo, o programador não tem controle sobre o que é deletado da memória. Isso impossibilita a utilização dos programas em sistemas críticos. Outros: Benchmark Da comparação entre lua e python, é possível perceber que lua tem um desempenho maior que python, mas python consome um pouco menos de memória, em média, e tem códigos mais compactos, em média. Na comparação entre lua e perl, é possível perceber que Lua teve um desempenho mais rápido do que Perl, mas consumiu mais memória e tinha códigos mais extensos do que perl. Comparando perl com c++ é possível perceber que esta é muito mais rápida que aquela e consome bem menos memória. Mas os códigos escritos em lua são mais compactos que em c++. Referências www.lua.org pt.wikipedia.org CELES, W., FIGUEIREDO, L. H., IERUSALIMSCHY, R. "A Linguagem Lua e suas aplicações em jogos."